<?php

declare(strict_types=1);

namespace app\net2023dev\controller;

// 收钱吧API
class Paysqb
{

    const vendor_sn = ''; // 开发者序列号/服务商序列号
    const vendor_key = ''; // 开发者密钥/服务商密钥
    const appid_bc = '2023072500005747'; // 应用ID/B扫C支付
    const appid_cb = '2023072500005748'; // 应用ID/C扫B支付
    const app_id = self::appid_bc; //业务应用场景应用ID

    const activate_code = '43210088'; // 终端激活码


    function index()
    {
        $device_id = md5('vbfdddwf345fdg3443554fg345fgdsgf'); // 设备唯一身份ID(自己定义)
        $terminal_sn = '100057470031501325'; // 终端序列号/激活设备-得到第一次
        $terminal_key = '47674f51b2eee74a6c47b64c1ac8e143'; // 终端密钥/激活设备-得到第一次
        // return app('http')->getName();//多应用模式下如何获取当前应用名
        // return '您好！这是一个[demo]示例应用' . time();

        // 激活接口对于同一台终端，只需要调用一次。
        // dump($this->  activate(self::vendor_sn,self::vendor_key,$device_id));//激活设备-得到【terminal_sn/终端号;terminal_ke/终端密钥】

        // 建议每自然天执行第一笔核心支付接口调用时，自动执行签到操作
        // $checkin = $this->checkin($terminal_sn, $terminal_key, $device_id); //签到-更新【terminal_sn/终端号;terminal_ke/终端密钥】
        // dump("签到:", json_decode($checkin, true)); //转数组

        $precreate = $this->precreate($terminal_sn, $terminal_key); //预下单
        $precreate_array = json_decode($precreate, true); //转数组
        dump("预下单:", $precreate_array);
        $sn = $precreate_array['biz_response']['data']['sn']; //收钱吧系统内部唯一订单号
        // dump("预下单单号:",  $sn);


        // $dynamic_id = "131453678354962495"; //客人支付界面条码数字
        // $pay = $this->pay($terminal_sn, $terminal_key,$dynamic_id); //立即支付-B扫C支付
        // dump("支付:", json_decode($pay, true));

        // $refund = $this->refund($terminal_sn, $terminal_key, $sn); //退款
        // dump("退款:" . $sn, json_decode($refund, true));

        $query = $this->query($terminal_sn, $terminal_key, $sn); //查询
        dump("查询:" . $sn, json_decode($query, true));
    }


    //激活接口
    function activate($vendor_sn, $vendor_key, $device_id)
    {
        $api_domain = 'https://vsi-api.shouqianba.com';
        $url = $api_domain . '/terminal/activate';
        $params['app_id'] = self::app_id; //app id，从服务商平台获取
        $params['code'] = self::activate_code; //激活码
        $params['device_id'] = $device_id; //设备唯一身份ID
        $ret = $this->pre_HTTP($params, $url, $vendor_sn, $vendor_key);
        return $ret;
    }
    //签到接口
    function checkin($terminal_sn, $terminal_key, $device_id)
    {
        $api_domain = 'https://vsi-api.shouqianba.com';
        $url = $api_domain . '/terminal/checkin';
        $params['terminal_sn'] = $terminal_sn; //终端号
        $params['device_id'] = $device_id; //设备唯一身份ID
        $ret = $this->pre_HTTP($params, $url, $terminal_sn, $terminal_key);
        return $ret;
    }

    //预下单接口
    function precreate($terminal_sn, $terminal_key)
    {
        $time = time();
        $mydate = date('Y-m-d H:i:s', $time);
        $p_id  = com_guid()["salt_any"];
        $api_domain = 'https://vsi-api.shouqianba.com';
        $url = $api_domain . '/upay/v2/precreate';
        $params['terminal_sn'] = $terminal_sn; //收钱吧终端ID
        //$params['sn']='';//收钱吧系统内部唯一订单号
        $params['client_sn'] = $p_id; //商户系统订单号,必须在商户系统内唯一；且长度不超过64字节
        $params['total_amount'] = '1'; //交易总金额
        $params['payway'] = '3';
        $params['subject'] = '本次交易的概述'; //本次交易的概述
        $params['operator'] = '本次交易的操作员'; //发起本次交易的操作员
        $params['sub_payway'] = ''; //内容为数字的字符串，如果要使用WAP支付，则必须传 "3", 使用小程序支付请传"4"
        //$params['payer_uid']='';//消费者在支付通道的唯一id,微信WAP支付必须传open_id,支付宝WAP支付必传用户授权的userId
        //$params['description']='';//对商品或本次交易的描述
        //$params['longitude']='';//经纬度必须同时出现
        //$params['latitude']='';//经纬度必须同时出现
        //$params['extended']='';//收钱吧与特定第三方单独约定的参数集合,json格式，最多支持24个字段，每个字段key长度不超过64字节，value长度不超过256字节
        //$params['goods_details']='';//商品详情
        //$params['reflect']='';//任何调用者希望原样返回的信息
        //$params['notify_url']='';//支付回调的地址
        $ret = $this->pre_HTTP($params, $url, $terminal_sn, $terminal_key);
        return $ret;
    }

    //支付接口
    function  pay($terminal_sn, $terminal_key, $dynamic_id)
    {
        $api_domain = 'https://vsi-api.shouqianba.com';  //收钱吧服务器域名
        $url = $api_domain . "/upay/v2/pay";
        $params['terminal_sn'] = $terminal_sn; //终端号
        $params['client_sn'] = $this->getClient_Sn(16); //商户系统订单号,必须在商户系统内唯一；且长度不超过64字节
        $params['total_amount'] = '2'; //交易总金额,以分为单位
        $params['payway'] = '3'; //支付方式,1:支付宝 3:微信 4:百付宝 5:京东钱包
        $params['dynamic_id'] = $dynamic_id; //条码内容（支付包或微信条码号）
        $params['subject'] = '交易简介'; //交易简介
        $params['operator'] = '门店操作员'; //门店操作员
        //$params['description']='';//对商品或本次交易的描述
        //$params['longitude']='';//经度(经纬度必须同时出现)
        //$params['latitude']='';//纬度(经纬度必须同时出现)
        //$params['device_id']='';//设备指纹
        //$params['extended']='';//扩展参数集合  { "goods_tag": "beijing"，"goods_id":"1"}
        //$params['goods_details']='';//商品详情 goods_details": [{"goods_id": "wx001","goods_name": "苹果笔记本电脑","quantity": 1,"price": 2,"promotion_type": 0}]
        //$params['reflect']='';//反射参数
        //$params['notify_url']='';//支付回调地址(如果支付成功通知时间间隔为1s,5s,30s,600s)
        $ret = $this->pre_HTTP($params, $url, $terminal_sn, $terminal_key);
        return $ret;
    }

    //退款接口
    function refund($terminal_sn, $terminal_key, $sn)
    {
        $api_domain = 'https://vsi-api.shouqianba.com';
        $url = $api_domain . '/upay/v2/refund';
        $params['terminal_sn'] = $terminal_sn; //收钱吧终端ID
        $params['sn'] = $sn; //收钱吧系统内部唯一订单号（N）
        //$params['client_sn']='';//商户系统订单号,必须在商户系统内唯一；且长度不超过64字节
        //$params['client_tsn']='';//商户退款流水号一笔订单多次退款，需要传入不同的退款流水号来区分退款，如果退款请求超时，需要发起查询，并根据查询结果的client_tsn判断本次退款请求是否成功
        $params['refund_amount'] = '1'; //退款金额
        $params['refund_request_no'] =  $this->getClient_Sn(20); //商户退款所需序列号,表明是第几次退款(正常情况不可重复，意外状况爆出不变)
        $params['operator'] = '门店操作员'; //门店操作员
        //$params['extended'] = '';//扩展参数集合
        //$params['goods_details'] = '';//商品详情
        $ret = $this->pre_HTTP($params, $url, $terminal_sn, $terminal_key);
        return $ret;
    }

    //查询接口
    function query($terminal_sn, $terminal_key, $sn)
    {
        $api_domain = 'https://vsi-api.shouqianba.com';
        $url = $api_domain . '/upay/v2/query';
        $params['terminal_sn'] = $terminal_sn; //收钱吧终端ID
        $params['sn'] = $sn; //收钱吧系统内部唯一订单号
        //$params['client_sn'] = '';//商户系统订单号,必须在商户系统内唯一；且长度不超过64字节
        $ret = $this->pre_HTTP($params, $url, $terminal_sn, $terminal_key);
        return $ret;
    }

    //wap api pro 接口
    function wap_api_pro($terminal_sn, $terminal_key)
    {
        $params['terminal_sn'] = $terminal_sn; //收钱吧终端ID
        $params['client_sn'] = ''; //商户系统订单号,必须在商户系统内唯一；且长度不超过64字节
        $params['total_amount'] = ''; //以分为单位,不超过10位纯数字字符串,超过1亿元的收款请使用银行转账
        $params['subject'] = ''; //本次交易的概述
        //$params['payway']='1';
        $params['notify_url'] = ''; //支付回调的地址
        $params['operator'] = ''; //发起本次交易的操作员
        $params['return_url'] = ""; //处理完请求后，当前页面自动跳转到商户网站里指定页面的http路径
        ksort($params);  //进行升序排序
        $param_str = "";
        foreach ($params as $k => $v) {
            $param_str .= $k . '=' . $v . '&';
        }
        $sign = strtoupper(md5($param_str . 'key=' . $terminal_key));
        $paramsStr = $param_str . "sign=" . $sign;
        $res = "https://qr.shouqianba.com/gateway?" . $paramsStr;
        //将这个url生成二维码扫码或在微信链接中打开可以完成测试
        file_put_contents('logs/wap_api_pro_' . date('Y-m-d') . '.txt', $res, FILE_APPEND);
    }

    //生成随机订单号
    function getClient_Sn($codeLenth)
    {
        $str_sn = '';
        for ($i = 0; $i < $codeLenth; $i++) {
            if ($i == 0)
                $str_sn .= rand(1, 9); // first field will not start with 0.
            else
                $str_sn .= rand(0, 9);
        }
        return $str_sn;
    }
    //签名
    function getSign($signStr)
    {
        $md5 = Md5($signStr);
        return $md5;
    }
    // 组织请求
    function pre_HTTP($params, $url, $terminal_sn, $terminal_key)
    {
        $j_params = json_encode($params);
        $sign = $this->getSign($j_params . $terminal_key);
        $result = $this->httpPost($url, $j_params, $sign, $terminal_sn);
        return $result;
    }
    //头部请求规则
    function httpPost($url, $body, $sign, $sn)
    {
        $header = array(
            "Format:json",
            "Content-Type: application/json",
            "Authorization:$sn" . ' ' . $sign
        );
        $result = $this->curl_HTTP($url, $body, $header);
        return $result;
    }
    // HTTP请求
    function curl_HTTP($url, $postfield, $header)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);  // 从证书中检查SSL加密算法是否存在
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postfield);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
        $response = curl_exec($ch);
        //dump(curl_error($ch));  //查看报错信息
        // file_put_contents('logs/web_api_' . date('Y-m-d') . '.txt', date("Y-m-d H:i:s", time()) . "===" . "返回：" . $response . "\n" . "请求应用参数：" . $postfield . "\n" . "\n" . "请求url：" . $url . "\n", FILE_APPEND);
        curl_close($ch);
        return $response;
    }
}
